#ifndef DEVMANAGER_H
#define DEVMANAGER_H

//Библиотека Qt.
#include <QObject>


//Внутренняя библиотека.
#include "viddevice.h"


//Объявление внешних классов.
class VidWidget;
class QTreeWidgetItem;


class DevManager : public QObject
{
	Q_OBJECT
signals:
	void information(const QString &msg);
	void warning(const QString &msg);
	void critical(const QString &msg);

	void deviceFramerateChanged(int framerate);

	void reloadDevices();

	void devicesSelected();
	void devicesConnect(const QList<VidDevice *> &viddevlist);
	void devicesDisconnect(const QList<int> &devindexlist);

	void sigSetParam(DevParam::SET_PARAM param, int value);
	void sigSetParam(DevParam::SET_PARAM param, bool value);

public:
	//Конструктор.
	DevManager(QObject *parent = NULL);

	//Деструктор.
	virtual ~DevManager();

	//Функция сохранения настроек приложения.
	void saveConfiguration();

	//Функция сохранения настроек приложения.
	void saveConfiguration(QList<VidDevice *> viddevlist);

	//Функция загрузки настроек приложения.
	void loadConfiguration(QStringList viddevstrlist);

	//Функция загрузки видеоустройств из системы.
	void loadDevicesFromSystem();

	//Функция добавления устройства.
	bool addDevice(QString devfname);

	//Функция добавления файлового плэйера.
	bool addFilePlayer(QString path);

	//Функция удаления устройств.
	void deleteDevices(QList<VidDevice *> viddevlist);

	//Функция удаления устройства.
	bool deleteDevice(int index);

	//Функция выбора всех устройств.
	void selectAllDevices();

	//Функция выбора одного устройства.
	void selectDevice(VidDevice *viddev);

	//Функция выбора стройств.
	void selectDevices(QList<VidDevice *> viddevlist);

	//Функция отмены выбора устройств.
	void clearDevicesSelection();

	//Функция возврата видеоустройства.
	VidDevice *getDevice(int index);

	//Функция поиска устройства в списке по имени файла.
	VidDevice *findDeviceFromFileName(QString devfname);

	//Функция возврата списка устройств.
	QList<QTreeWidgetItem *> getDevicesGroupList(int dev_col, int win_col, int motion_col, int net_col);

	//Функция возврата списка значений параметра выбранных устройств.
	void getListParam(DevParam::GET_LIST_PARAM param, QHash<int, QVariant> *valhash);

	//Функция возврата значения параметра выбранных устройств.
	void getParam(DevParam::GET_PARAM param, QVariant *value);

	//Функция установки значения параметра выбранных устройств.
	void setParam(DevParam::SET_PARAM param, QVariant value);

	//Функция управления активностью детектора движения.
	void setMotionEnabled(bool enabled);

	//Функция управления активностью записи видео в файл.
	void setFileWriterTrigger(bool is_absolute);

private:
	//Список видеоустройств.
	QList<VidDevice *> vidDevList;

	//Список выбранных видеоустройств.
	QList<VidDevice *> selVidDevList;

	//Функция возврата устройства с удалением его из списка.
	VidDevice *takeDevice(int index, QList<VidDevice *> *viddevlist);

	//Функция возврата списка параметров устройства.
	QStringList getDeviceParams(VidDevice *viddev);

	//Функция возврата эквивалентности двух списков.
	bool isEqualLists(QStringList firstlist, QStringList secondlist);

};

#endif
